perm filename BACKUP[2,DBL] blob sn#016205 filedate 1972-12-17 generic text, type T, neo UTF8
00100	BEGIN
00200	EXPR ENTER();
00300	     BEGIN
00400	     PRINTSTR '"THE SYSTEM IS STARTED";
00500	   S;PRINTSTR '"
00600	
00700	            PLEASE TYPE IN A REQUEST
00800	                      
00900	 ...";
01000	     L←READ();
01100	     LHOLD←L;
01200	     IF NULL(L) THEN RETURN  '"THE SYSTEM IS ENDED.";
01300	     PRINT D(L);
01400	     GO S;
01500	     END;
01600	EXPR D(L);
01700	     BEGIN NEW FN, A, N, RELATEDF;
01800	     I←READINKNOWN();
01900	     KNOWNF←IDATA[1];
02000	     TARG←IDATA[2];
02100	     NARG←IDATA[3];
02200	     TRE←IDATA[4];
02300	     BA1←IDATA[5];
02400	     BA2←IDATA[6];
02500	     FN←L[1];
02600	     FN2←FN;
02700	     A←CDR(L);
02800	     N←LENGTH(A);
02900	     RELATEDF←'(NIL NIL NIL NIL);
03000	     IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
03100	       ELSE RETURN K2(FN,A,N,RELATEDF);
03200	     END;
03300	EXPR INIT();
03400	     BEGIN
03500	      UNKNOWN ←'UNKNOWN;
03600	     INF←0;
03700	     ORD←'(NIL);
03800	     PRINTSTR '"TYPE IN HOW DEEPLY WE SHOULD RECURSE BEFORE
03900	       GIVING UP AS INFINITE LOOP (I SUGGEST 50) ...";
04000	     LIMINFBASE←READ();
04100	     TWICELIMINF ← LIMINF + LIMINF;
04200	     TRIPLELIMINF ← LIMINF + TWICELIMINF;
04300	     BA1←'(FN CAR CDR IDEN MINUS ATOM LISTP NUMBERP NULL
04400	     LIST CONST1  ZERO1
04500	        QUOTE EVAL LENGTH NOT HALF SUB1 ADD1 );
04600	     BA2←'(CONS PI12 PI22 FN2 LIST PLUS TIMES MEMBER APPEND 
04700	        GREATERP LESSP EQUAL AND OR NOT);
04800	     PRINTSTR '"TYPE IN MESSAGE LEVEL (I SUGGEST 3)...";
04900	     MSGLEVEL←READ();
05000	     KNOWNF ←'(CAR CDR CONS IDEN
05100	       PLUS TIMES MINUS
05200	       ATOM LISTP NUMBERP NULL
05300	       QUOTE EVAL
05400	       LENGTH MEMBER
05500	       GREATERP LESSP EQUAL
05600	       AND OR NOT 
05700	       HALF PI12 PI22 ZERO1 ZERO2 
05800	       CONST1 CONST2 SUB1 ADD1 LIST APPEND FN FN2);
05900	     SCHEMA←'(DE FN(L) (COND
06000	       ((EQUAL (F1 L) C1)  (F2 L))
06100	       ((EQUAL (F8 L) C3)  (F9 L))
06200	       ((OR (GT L) (AND (INFINITY ) ((CAR (GET F4 TARGS)) (F3 L))
06300	         ((CAR (GET F6 TARGS)) (F5 L))
06400	         ((CAR (GET F7 TARGS)) (F4 (F3 L)))
06500	         ((CADR (GET F7 TARGS)) (F6 (F5 L))) ))
06600	        (F7 (F4 (F3 L)) (F6 (F5 L))))
06700	       (T  C2)));
06800	     I ← EVAL(SCHEMA);
06900	     I←GS2(); I←EVAL(SCHEMA2);
07000	     NARGS←'NARGS; TARGS←'TARGS;TRES←'TRES;
07100	     RETURN PUTFORM();
07200	     END;
07300	EXPR IDEN(A); A;
07400	EXPR HALF(A); A/2;
07500	EXPR K1(FN,A,N,RELATEDF); 
07600	     BEGIN NEW I;
07700	     I← GET(FN,'NARGS);
07800	     IF I=N OR I=11 THEN RETURN EVAL(L);
07900	     PRINTSTR '"THIS FUNCTION TAKES EXACTLY";
08000	     PRIN1(I);
08100	     PRINTSTR '" ARGUMENT(S), BUT YOU USED IT WITH";
08200	     PRIN1(N); PRINTSTR '"ARGUMENT(S).
08300	         ARE WE DEFINING A NEW BUT CLOSELY
08400	        RELATED FUNCTION  Y OR N ...";
08500	      IF READ()='Y THEN RELATEDF[1,1]←FN
08600	       ELSE PRINTSTR '"ARE WE DEFINING A NEW FUNCTION HERE OR
08700	         NOT  Y OR N ..."
08800	         ALSO IF READ()='N THEN RETURN  '"IGNORING THE REQUEST ENTIRELY";
08900	     PRINTSTR '"PICK A NEW FUNCTION NAME TO REPLACE THIS NEWEST USE OF";
09000	     PRIN1 FN;
09100	     PRINTSTR '"...";
09200	     FN←READ();
09300	     FN2←FN;
09400	     IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
09500	     ELSE RETURN K2(FN,A,N,RELATEDF);
09600	     END;
09700	EXPR K2(FN,A,N,RELATEDF);
09800	     BEGIN NEW II,I;
09900	     PRINTSTR '"READY TO MAKE NEW FUNCTION. DO YOU WANT TO";
10000	     PRINTSTR '"  CHANGE YOUR REQUEST Y OR N...";
10100	     IF READ()='Y THEN RETURN  '"VERY WELL. IGNORING
10200	     THE REQUEST ENTIRELY";
10300	     FOR NEW J←1 TO LENGTH(KNOWNF)-1 DO 
10400	       PUTPROP(KNOWNF[J],NIL,'RVAL);
10500	     F1←NIL; F2←NIL; F3←NIL; F4←NIL; F5←NIL; F6 ←NIL; 
10600	      F7←NIL; F8←NIL;F9←NIL; F10←NIL; F11←NIL; F12←NIL;
10700	      F13←NIL; F14←NIL; F15←NIL; F16←NIL; F17←NIL;
10800	      F18←NIL; F19←NIL;     EXAMPLE←NIL;
10900	     CO←CDR(BA1); CO2 ←CDR(BA2);
11000	     ORDER2←<BA2,CO,CO,BA2,CO,CO,BA2,CO,CO,BA2,CO,CO,
11100	       BA2,BA2,CO,CO,BA2,CO,CO>;
11200	     ORDER←<CO,CO,CO,BA1,CO,BA1,CO2>;
11300	          PRINTSTR '"FOR EACH OF THE FOLLOWINGS FUNCTIONS, TYPE 
11400	EITHER TH WORD STOP OR A FUNCTION NAME, A SPACE, AND THEN A
11500	     1/2/3/4/5, MEANING THAT THE FN. IS DEFINITELY/PROBABLY/POSSIBLY
11600	     /PROBABLY NOT/DEFINITELY NOT  RELATED TO"; 
11700	     PRIN1 (FN);
11800	     PRINT (KNOWNF);
11900	     FOR NEW J←1 TO LENGTH(KNOWNF) DO BEGIN
12000	   S;    I←READ();
12100	     IF I= 'STOP THEN GO SSS;
12200	     II←READ();
12300	     PUTPROP (I, II, 'RVAL);
12400	       IF MEMBER(II,'(1 2 3 4)) THEN 
12500	       RELATEDF[II] ← I CONS RELATEDF[II]
12600	          ELSE IF NOT(II=5) THEN
12700	        PRINTSTR '"NO,NO! TYPE IN ONE DIGIT FROM 1 TO 5!!!"
12800	       ALSO GO S;
12900	   SSS; END UNTIL I= 'STOP;
13000	     PRINTSTR '"DO YOU THINK RECURSION (OR AN AUXILLIARY FN. WILL
13100	     BE REQUIRED HERE  Y OR N OR M(FOR MAYBE) ...";
13200	     I←READ();
13300	     IF I='Y THEN RETURN REC(FN,A,N,RELATEDF)
13400	       ELSE RETURN NREC(FN,A,N,RELATEDF,I);
13500	     END;
13600	EXPR PUTFORM();
13700	     BEGIN NEW ID,NA,TA,TR;
13800	     TF←NIL;
13900	     IF MAKELISTS()=NIL THEN RETURN PRINTSTR '"MAKELISTS IS NIL";
14000	     FOR NEW I←1 TO LENGTH(KNOWNF) DO
14100	     BEGIN
14200	     PF←NIL;
14300	     PF[1]←'PF1; PF[2]←'PF2; PF[3]←'PF3; PF[4]← 'PF4;
14400	     PF[5]←'PF5; PF[6]←'PF6; PF[7]←'PF7;
14500	     PF[8]←'PF8; PF[9]←'PF9; P2F[1]←'P2F1; P2F[2]←'P2F2; 
14600	     P2F[3]←'P2F3; P2F[4]←'P2F4; P2F[5]←'P2F5; P2F[6]←'P2F6;
14700	     P2F[7]←'P2F7; P2F[8]←'P2F8; P2F[9]←'P2F9;
14800	      P2F[10]←'P2F10; P2F[11]←'P2F11;
14900	      P2F[12]←'P2F12; P2F[13]←'P2F13; P2F[14]←'P2F14;
15000	      P2F[15]←'P2F15; P2F[16]←'P2F16; P2F[17]←'P2F17;
15100	     P2F[18]←'P2F18; P2F[19]←'P2F19;
15200	     ID←KNOWNF[I];
15300	     NA←NARG[I];
15400	     PUTPROP(ID,NA,'NARGS);
15500	     TA←TARG[I];
15600	     PUTPROP(ID,TA,'TARGS);
15700	     TR←TRE[I];
15800	     PUTPROP(ID,TR,'TRES);
15900	     FOR NEW J←1 TO 9 DO PUTPROP(ID,TF[J,I],PF[J]);
16000	     FOR NEW J←1 TO 19 DO PUTPROP(ID,T2F[J],P2F[J]);
16100	     PUTPROP('FN,2,'RVAL);
16200	     PUTPROP ('FN2,2,'RVAL);
16300	     PUTPROP('FALSE,'(ANY),TARGS);
16400	     PUTPROP('FALSE2,'(ANY ANY), TARGS);
16500	     END;
16600	     END;
16700	EXPR MAKELISTS();
16800	     BEGIN
16900	     NARG ← '(1 1 2 11 11 11 1
17000	     1 1 1 1 1 1 1 2 11 11 11 11 11 11 1 2 2 1 
17100	      2 1 2 1 1 11 2 1 2);
17200	     TARG←'((LISTP) (LISTP) (ATOM LISTP) (ANY ANY)
17300	         (NUMBER NUMBER) (NUMBER NUMBER)
17400	       (NUMBER) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY) 
17500	       (ANY LISTP) (NUMBER NUMBER)  (NUMBER NUMBER) (ANY ANY)
17600	       (ANY ANY) (ANY ANY) (ANY ANY) (NUMBER) (ANY ANY) (ANY ANY)
17700	       (ANY) (ANY ANY) (ANY) (ANY ANY) (NUMBER) (NUMBER)
17800	       (ANY) (ANYLIST ANYLIST) (ANY) (ANY ANY));
17900	     TRE←'(ANY LISTP LISTP ANY NUMBER NUMBER NUMBER
18000	       TF TF TF TF ANY ANY
18100	       NUMBER TF TF TF TF TF TF TF NUMBER ANY ANY NUMBER
18200	       NUMBER ANY ANY NUMBER NUMBER ANYLIST LIST ANY ANY);
18300	     TF[1]← '(7 7 0 5 0 0 14 5 14 14 10 25 14 10 0 0 0 0 0 0
18400	       14 10 0 0 25 0 25 0 10 10 14 0 0);
18500	     TF[2]← '(10 10 0 5 0 0 14 5 14 14 14 25 14 14 0 0 0 0 0 0
18600	       25 10 0 0 10 0 10 0 14 14 7 0 0);
18700	     TF[3] ← '(5 7 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
18800	       25 14 0 0 14 0 14 0 7 7 10 0 0);
18900	     TF[4] ← '(7 10 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
19000	       14 10 0 0 25 0 25 0 10 10 14 0 5);
19100	     TF[5] ← '(7 5 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
19200	       25 14 0 0 14 0 14 0 7 7 7 0 0);
19300	     TF[6] ← '(10 7 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
19400	       14 10 0 0 25 0 25 0 10 10 10 0 5);
19500	     TF[7] ← '(0 0 5 0 10 10 0 0 0 0 0 0 0 0 25 25 14 25 14 14
19600	       0 0 7 7 0 14 0 14 0 0 0 5 0);
19700	     TF[8]←TF[1]; TF[9]←TF[2];
19800	     I←GETT2F();
19900	     RETURN PRINTSTR '"SUCCESFUL END OF MAKELISTS";
20000	     END;
20100	EXPR FALSE(A); NIL;
20200	EXPR TRUE(A); T;
20300	EXPR GETEX(N8);
20400	     BEGIN NEW I;
20500	     N9 ← LENGTH(EXAMPLE) + 1;
20600	     IF N9=1 THEN RETURN PRIM(NIL);
20700	    S; PRINTSTR '"PLEASE GIVE ME AN EXAMPLE.";
20800	       PRINTSTR '" THE ARGUMENT LIST...";
20900	      EXAMPLE[N9,1]←READ();
21000	      PRINTSTR '"THE FUNCTION VALUE...";
21100	      EXAMPLE[N9,2]←READ();
21200	      PRINTSTR '"DID YOU MAKE AN ERROR?  ";
21300	      I←READ();
21400	      IF I='Y THEN GO S;
21500	      RETURN EXAMPLE[N9];
21600	     END;
21700	EXPR PI12(A,B); A;
21800	EXPR PI22(A,B); B;
21900	EXPR ZERO1(A); 0;
22000	EXPR ZERO2(A,B); 0;
22100	EXPR CONST1(A); 1;
22200	EXPR CONST2(A,B); NIL;
22300	EXPR INFINITY();
22400	     BEGIN
22500	     INF←INF+1;
22600	     RETURN  LESSP(INF,LIMINF);
22700	     END;
22800	EXPR REC(FN,A,N,RELATEDF);
22900	     BEGIN
23000	     NEW I,II,I1,I2,KK,JJ1,JJ2;
23100	    S; PRINTSTR '"WHICH:  TYPE AN R(RECURSION), A(AUX.FN.), OR
23200	     B(BOTH)...";
23300	     I←READ();
23400	     IF NOT(MEMBER(I,'(R A B))) THEN
23500	         PRINTSTR '"NO,NO!! TYPE R,A, OR B  ONLY..."
23600	      ALSO GO S;
23700	     IF NOT I='R THEN RETURN '"O.K. LET'S WORK ON THE AUX.FN.
23800	       TYPE IT IN AS IF IT WERE YOUR REQUEST:";
23900	     IF N=2 THEN I←PRIM2() ELSE
24000	     I←GETEX(1);
24100	     NEX←0;
24200	     PRINTSTR '"HOW MANY MORE EXAMPLES WILL YOU GIVE ME
24300	       (I SUGGEST 2) ....";
24400	      NEX←READ();
24500	     FOR NEW KK←1 TO NEX DO II←GETEX(KK+1);
24600	      L←CADAR(A);
24700	     NEX ← NEX + ONEX;
24800	     IF NOT(N=1) THEN  RETURN REC2(FN,A,N,RELATEDF);
24900	        I←'(ANY);
25000	     E←NIL; MA←T; MN←T; MAL←T; EXAMPLE[NEX+2,1]←L;
25100	     FOR NEW X←1 TO NEX+1 DO BEGIN E←EXAMPLE[X+1,1];
25200	     MA←MA AND ATOM(E); MN←MN AND NUMBER(E);
25300	     MAL←MAL AND ANYLIST(E); END; 
25400	     IF MAL THEN I←'(ANYLIST);
25500	     IF MA THEN I←'(ATOM);
25600	     IF MN THEN I←'(NUMBER);
25700	     PUTPROP('FN,I,'TARGS);
25800	     PUTPROP('FN,1,'NARGS);
25900	     PUTPROP('FN,'ANY,'TRES);
26000	     IHOLD←I;
26100	     PRINTSTR '"DO YOU KNOW THE TYPE OF ARGUMENTS 
26200	       FOR THE FN?   MY GUESS IS"; PRINC (IHOLD);
26300	     PRINTSTR '"ANSWER Y IF YOU WANT TO MAKE A BETTER GUESS,
26400	             N IF YOU THINK THAT IT IS O.K. AS STATED ...  ";
26500	     I←READ(); IF I='Y THEN BEGIN PRINTSTR '"O.K. TYPE IN ONE
26600	     OF TH FOLLOWING WORDS: ANY ANYLIST LISTP NUMBER...";
26700	     I←READ(); 
26800	     PUTPROP('FN,<I>,'TARGS);
26900	     IHOLD←<I>;
27000	      END;
27100	     FOR NEW K←1 TO 7 DO
27200	     ORD[K]←INTERSECTION(RELATEDF[1]@
27300	       RELATEDF[2]@<'FN>@RELATEDF[3]
27400	       @RELATEDF[4],ORDER[K]);
27500	     ORD[8]←ORD[1]; ORD[9]←ORD[2];
27600	      FOR NEW K←1 TO 9 DO ORD[K]←RANK(K,ORD);
27700	     PRINTSTR '"DO YOU WANT TO CUT DOWN THE POSSIBILITIES
27800	         EVEN FURTHER?  Y OR N ...";  I←READ();
27900	     IF I='Y THEN FOR NEW X←1 TO 9 DO BEGIN
28000	       PRINT (<'ORD,X,ORD[X]>); PRINTSTR '"NOW RETYPE ORD[X]";
28100	     I ← READ(); IF NOT(I='S) THEN ORD[X]←I;
28200	 END;
28300	     IF C1=UNKNOWN THEN C1←T;
28400	     IF C3=UNKNOWN THEN C3←T;
28500	     I←NIL; II←NIL;
28600	     LIMINF←LIMINFBASE;
28700	     FOR NEW T1←1 TO LENGTH(ORD[1]) DO BEGIN
28800	       F1←ORD[1,T1];
28900	     IF GREATERP(MSGLEVEL,0) THEN
29000	PRINT(<1,'T1,T1,'F1,F1,'L,L,'RELATEDF,RELATEDF,'ORD,ORD>);
29100	     IF FOR NEW X←2 TO NEX+1 ; AND BEGIN
29200	       E←EXAMPLE[X,1];
29300	       RETURN EVAL '((CAR (GET F1 TARGS)) E) ;
29400	       END AND
29500	     (GOODEX=NIL OR F1(GOODEX[1])=C1) THEN
29600	     FOR NEW T2←1 TO LENGTH(ORD[2]) DO BEGIN
29700	          F2←ORD[2,T2];
29800	     IF GREATERP(MSGLEVEL,1) THEN
29900	PRINT(<2,'T2,T2,'F2,F2>);
30000	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
30100	      E←EXAMPLE[X,1];
30200	       RETURN EVAL '((CAR (GET F2 TARGS)) E) ;
30300	        END  AND
30400	     (NOT(GOODEX) OR F2(GOODEX[1])=GOODEX[2]) THEN
30500	     FOR NEW T8←1 TO LENGTH(ORD[8]) DO BEGIN
30600	       F8←ORD[8,T8];
30700	     IF GREATERP(MSGLEVEL,9) THEN PRINT(<8,'T8,T8,'F8,F8>);
30800	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
30900	       E←EXAMPLE[X,1];
31000	       RETURN EVAL '((CAR (GET F8 TARGS)) E); END AND
31100	     (GOODEX2=NIL OR F8(GOODEX2[1])=C3)  THEN
31200	     FOR NEW T9←1 TO LENGTH(ORD[9]) DO BEGIN
31300	       F9←ORD[9,T9];
31400	     IF GREATERP (MSGLEVEL,10) THEN PRINT(<9,'T9,T9,'F9,F9>);
31500	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
31600	       E←EXAMPLE[X,1];
31700	       RETURN EVAL '((CAR (GET F9 TARGS)) E); END AND
31800	     (NOT(GOODEX2) OR F9(GOODEX2[1])=GOODEX2[2]) THEN
31900	     FOR NEW T3←1 TO LENGTH(ORD[3]) DO BEGIN
32000	       F3←ORD[3,T3];
32100	     IF GREATERP(MSGLEVEL,2) THEN
32200	  PRINT(<3,'T3,T3,'F3,F3>);
32300	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
32400	       E←EXAMPLE[X,1];
32500	       RETURN ( GT(E) OR  EVAL '((CAR (GET F3 TARGS)) E) );
32600	     END THEN
32700	     FOR NEW T4←1 TO LENGTH(ORD[4]) DO BEGIN
32800	     F4←ORD[4,T4];
32900	     IF F4='FN THEN LIMINF←TWICELIMINF;
33000	     IF GREATERP(MSGLEVEL,3) THEN
33100	  PRINT(<4,'T4,T4,'F4,F4,'GETF4TARGS,GET(F4,TARGS)>);
33200	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
33300	       E←EXAMPLE[X,1];
33400	       RETURN ( GT(E) OR  EVAL '((CAR (GET F4 TARGS)) (F3 E) )) ;
33500	       END THEN 
33600	     FOR NEW T5←1 TO LENGTH(ORD[5]) DO BEGIN
33700	     F5←ORD[5,T5];
33800	     IF GREATERP(MSGLEVEL,4) THEN
33900	  PRINT (<5,'T5,T5,'F5,F5>);
34000	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
34100	       E←EXAMPLE[X,1];
34200	       RETURN (GT(E) OR EVAL '((CAR (GET F5 TARGS)) E)) ;
34300	       END THEN
34400	     FOR NEW T6←1 TO LENGTH(ORD[6]) DO BEGIN
34500	     F6←ORD[6,T6];
34600	     IF F6='FN THEN LIMINF ← TRIPLELIMINF;
34700	     IF GREATERP(MSGLEVEL,5) THEN
34800	PRINT (<6,'T6,T6,'F6,F6,'(I HAVE CHOSEN LIMINF TO BE),LIMINF>);
34900	     IF FOR NEW X←2 TO NEX+1; AND BEGIN
35000	       E←EXAMPLE[X,1];
35100	       RETURN ( GT(E) OR  EVAL '((CAR (GET F6 TARGS)) (F5 E) )) ;
35200	       END THEN
35300	     FOR NEW T7←1 TO LENGTH(ORD[7]) DO BEGIN
35400	     F7←ORD[7,T7];
35500	     IF GREATERP(MSGLEVEL,6) THEN
35600	  PRINT (<7,'T7,T7,'F7,F7>);
35700	JJ1← FOR NEW KK←2 TO NEX+2; AND BEGIN E←EXAMPLE[KK,1];
35800	     RETURN (GT(E) OR
35900	       EVAL('((CAR (GET F7 TARGS)) (F4 (F3 E))))); END;
36000	JJ2← FOR NEW HH←2 TO NEX+2; AND BEGIN E←EXAMPLE[HH,1];
36100	     RETURN (GT(E) OR
36200	      EVAL ('((CADR (GET F7 TARGS)) (F6 (F5 E))))) 
36300	     ; END;
36400	     IF JJ1 AND JJ2 THEN  INF←0
36500	     ALSO I← FOR NEW X←2 TO NEX+1; AND BEGIN
36600	       INF←0;
36700	       E←EXAMPLE[X,1];
36800	       RETURN (EXAMPLE[X,2] = EVAL '(FN E)  );
36900	       END;
37000	     IF I THEN PRINTSTR '"
37100	                 HOORAY, HOORAY!!!
37200	                    SUCCESS!!
37300	            ";
37400	      RETURN I;
37500	     END UNTIL I
37600	     END UNTIL I
37700	     END UNTIL I
37800	     END UNTIL I
37900	     END UNTIL I
38000	     END UNTIL I
38100	     END UNTIL I
38200	     END UNTIL I
38300	     END UNTIL I;
38400	     IF GREATERP(MSGLEVEL,0) THEN
38500	      PRINT <'F123456789,F1,F2,F3,F4,F5,F6,F7,F8,F9,'C1234,C1,C2,C3,C4>;
38600	     KNOWNF← FN CONS KNOWNF; TARG ←GET('FN,'TARGS) CONS TARG;
38700	     NARG←N CONS NARG; TRE ← GET('FN,'TRES) CONS TRE;
38800	     BA1 ← FN CONS BA1; IF GREATERP(MSGLEVEL,2) THEN
38900	     PRINT <'KNOWNF,KNOWNF,
39000	       'TARGNARGTRE,TARG,NARG,TRE,'BA1,BA1>;
39100	     FINALIZE();
39200	     PUTPROP(FN,1,NARGS);
39300	     PUTPROP(FN,IHOLD,TARGS);
39400	        PUTPROP(FN,'(ANY),TRES);
39500	     FOR NEW J←1 TO 9 DO PUTPROP(FN,11,PF[J]);
39600	     RETURN FN
39700	     END;
39800	EXPR GT(E);
39900	     OR( GOODEX AND GOODEX[1]=E, GOODEX2 AND GOODEX2[1]=E);
40000	EXPR INTERSECTION(A,B);
40100	     BEGIN NEW III;
40200	     III←NIL;
40300	     FOR NEW JJJ IN A DO
40400	     IF MEMBER(JJJ,B) THEN III←  III @ <JJJ>;
40500	     RETURN III;
40600	     END;
40700	EXPR LISTP(A);AND( NOT(ATOM(A)), LENGTH(A) ≥ 1);
40800	EXPR ANY(A); T;
40900	EXPR NUMBER(A); NUMBERP(A);
41000	EXPR ANYLIST(A);OR(NULL(A),NOT(ATOM(A)));
41100	EXPR PRINTMATRIX();
41200	     BEGIN NEW J;
41300	     PRINTSTR '"FNAME   TF1    TF2    TF3    TF4    TF5    TF6    TF7    TF8    TF9";
41400	     FOR NEW I IN KNOWNF DO BEGIN
41500	     J← FOR NEW K IN PF COLLECT
41600	       <GET(I,K)>;
41700	        RETURN PRINT (I CONS J);
41800	       END;
41900	     END;
42000	EXPR PRIM(NIL);
42100	     BEGIN NEW I,I1,I2;
42200	     GOODEX←NIL;
42300	     GOODEX2 ← NIL;
42400	     F8←NIL;
42500	     F9←NIL;
42600	     ONEX ← 0;
42700	     F1 ← NIL;
42800	      F2 ← NIL;
42900	     PRINTSTR '"THERE IS SOME TRIVIAL (PRIMITIVE) CASE (OR TWO).
43000	       DO YOU KNOW ANYTHING ABOUT IT?  Y OR N ...";
43100	     I ← READ();
43200	     IF I ='N THEN BEGIN
43300	           IF GREATERP(MSGLEVEL,1) THEN PRINTSTR
43400	       '"ASSUMING C1 TO BE T, C2 TO BE UNKNOWN";
43500	       C1 ← T; C2 ← UNKNOWN;
43600	     C3←T; C4←UNKNOWN;
43700	       EXAMPLE[1] ← <C1,C2>;
43800	       RETURN NIL; END ALSO RETURN NIL;
43900	     PRINTSTR '"FOR SOME FUNCTIONS F1,F2 AND SOME CONSTANTS C1,C2
44000	       WHEN F1(ARGUMENT)=C1 THEN THE VALUE OF YOUR FN IS C2=F2(ARG)
44100	          NOTE: C2 MAY NOT ACTUALLY BE A CONSTANT (JUST TYPE UNKNOWN)
44200	
44300	        NOW TYPE IN A FUNCTION NAME OR THE WORD NIL FOR F1,F2
44400	        AND A CONSTANT OR TH WORD UNKNOWN FOR C1,C2 :
44500	       F1 ...";
44600	     F1←READ();
44700	     PRINTSTR '"      F2 ..."; 
44800	     F2 ← READ();
44900	     PRINTSTR '"       C1 ...";
45000	     C1 ← READ();
45100	     PRINTSTR '"       C2 ...";
45200	     C2 ← READ();
45300	     EXAMPLE[1] ← <C1,C2>;
45400	     PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE? ";
45500	     PRINTSTR '"Y OR N ...";
45600	     I ← READ();
45700	     IF I='Y THEN I←GETEX(2) ALSO ONEX←1 ALSO GOODEX←EXAMPLE[2];
45800	     IF GOODEX AND F1 THEN C1←F1(GOODEX[1]);
45900	     IF GOODEX AND F2 THEN C2←F2(GOODEX[1]);
46000	     PRINTSTR '"IS THERE ANOTHER TRIVIAL CASE? Y OR N...";
46100	     I←READ();
46200	                 IF I='N THEN BEGIN
46300	      C3←T; C4←UNKNOWN;
46400	      F8←'FALSE; F9←'FALSE;
46500	       END 
46600	     ALSO RETURN NIL;
46700	     PRINTSTR '"FOR SOME FUNCTIONS F8,F9,  AND SOME CONSTANTS C3,C4
46800	       WHEN F8(ARGUMENT)=C3  HEN THE VALUE OF YOUR FUNCTION
46900	         IS C3=F9(ARGUMENT)
47000	           NOTE: C4 MAY NOT ACTUALLY BE A CONSTANT (SAY UNKNOWN)
47100	
47200	        AS BEFORE, TYPE IN SOMETHING FOR ....
47300	                  F8  F9  C3  C4       HERE:";
47400	     F8←READ();F9←READ();C3←READ();C4←READ();
47500	     PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE? 
47600	        Y OR N ...";
47700	     I←READ();
47800	     IF I='Y THEN I←GETEX(3) ALSO ONEX←ONEX+1 ALSO GOODEX2←EXAMPLE[3];
47900	     IF GOODEX2 AND F8 THEN C3←F8(GOODEX2[1]);
48000	     IF GOODEX2 AND F9 THEN C4←F9(GOODEX2[1]);
48100	     RETURN NIL; END;
48200	EXPR RANK(K,LL);
48300	     BEGIN NEW VAL,TEMP,OLDR,RL;
48400	     L←LL;
48500	     IF NULL(L[K]) THEN 
48600	       (IF K=7 THEN RETURN '(PI22) ELSE RETURN '(IDEN));
48700	     IF FSUB(K) THEN RETURN <FSUB(K)>;
48800	     VAL←NIL;
48900	     II←NIL;
49000	     II←L[K];
49100	     L←II;
49200	     LEN ← LENGTH(L);
49300	     OLDL←L;
49400	     FOR NEW II ←1 TO LEN  DO
49500	     BEGIN
49600	       I←L[II];
49700	       IF MEMBER(I,KNOWNF) AND
49800	           GET(I,'RVAL) AND
49900	           GET(I, PF[K]) AND NOT(GET(I,PF[K])=0) THEN
50000	         VAL[II] ← TIMES( GET(I,PF[K]), GET(I,'RVAL))
50100	       ELSE VAL[II] ← 1000;
50200	     END;
50300	     IF GREATERP(MSGLEVEL,20) THEN
50400	       PRINT(<'VAL,VAL,'L,L>);
50500	     FOR NEW KOUNTER←1 TO LEN DO
50600	     FOR NEW I1←1 TO LEN-1 DO
50700	     FOR NEW I2←I1+1 TO LEN DO
50800	       IF GREATERP(VAL[I1],VAL[I2]) THEN BEGIN
50900	         TEMP←VAL[I1]; VAL[I1]←VAL[I2]; VAL[I2]←TEMP;
51000	         TEMP←L[I1]; L[I1]←L[I2]; L[I2]←TEMP;
51100	       END;
51200	       RL←L;
51300	     TEMP← FOR NEW J←1 TO LEN COLLECT
51400	     BEGIN IF VAL[J]=1000 THEN RETURN NIL
51500	       ELSE RETURN <L[J]>;
51600	       END;
51700	     L ← TEMP;
51800	     IF GREATERP(MSGLEVEL,9) THEN PRINT (<'OLDL,OLDL,'RANKEDL,
51900	       RL, 'CHOPPEDL, L>);
52000	     RETURN L;
52100	     END;
52200	EXPR FINALIZE();
52300	     BEGIN 
52400	     IF F4='FN THEN F4←FN; IF F6='FN THEN F6←FN;
52500	     EVAL <'DE, FN, '(L),
52600	       <'COND, <<'EQUAL, <F1, 'L>, C1>, <F2,'L>>,
52700	               <<'EQUAL, <F8, 'L>, C3>, <F9, 'L>>,
52800	               <'T,<F7, <F4, <F3, 'L>>,
52900	                        <F6, <F5, 'L>>>>>>;
53000	     RETURN KEEP();
53100	     END;
53200	EXPR PERMANENT();
53300	     BEGIN NEW I;
53400	     EVAL '(OUTC (OUTPUT DSK: PW1KNOWNF) NIL);
53500	     PRINT(<KNOWNF,TARG,NARG,TRE,
53600	       BA1,BA2> );
53700	     EVAL '(OUTC NIL T);
53800	     END;
53900	EXPR KEEP();
54000	     BEGIN NEW I;
54100	     PRINTSTR '"THE ANSWER TO YOUR REQUEST IS";
54200	     PRINT (EVAL(LHOLD));
54300	     PRINTSTR '"
54400	
54500	     DO YOU WISH TO ENTER THIS FUNCTION AS A PERMANENT PART
54600	          OF THE SYSTEM?  Y OR N...";
54700	     I←READ();
54800	     IF I='N THEN RETURN NIL;
54900	     I← PERMANENT();
55000	     IF GREATERP(MSGLEVEL,23) THEN PRINT
55100	     (<'KNOWNF,KNOWNF,'TARG,TARG,'NARG,NARG,'TRE,TRE,'BA1,
55200	      BA1,'BA2,BA2>);
55300	     RETURN NIL; END;
55400	EXPR READINKNOWN();
55500	     BEGIN NEW I;
55600	     I←EVAL '(INC (INPUT DSK: PW1KNOWNF) NIL);
55700	     IDATA←NIL;
55800	     IDATA← READ();
55900	     I←EVAL '(INC NIL T);
56000	     IF GREATERP(MSGLEVEL ,24) THEN PRINT (<'IDATA,
56100	       IDATA>);
56200	     RETURN NIL; END;
56300	EXPR GETT2F();
56400	     BEGIN
56500	     T2F[1]← '(0 0 14 0 25 25 0 0 0 0 0 0 0 0 25 14 14 25 14
56600	        14 0 0 7 7 0 25 0 25 0 0 25 25 0 25);
56700	     TF[2] ← '(10 10 0 7 0 0 25 14 14 14 14 25 25 14 0 0 0 0 0
56800	              0 25 14 0 0
56900	       25 0 25 0 10 10 25 0 0 0);
57000	     TF[3] ← TF[2];
57100	     TF[4] ← '(0 0 10 0 25 25 0 0 0 0 0 0 0
57200	           0 25 25 25 25 25 25 0 0 7 7 0 25 0
57300	       25 0 0 24 14 0 14);
57400	     TF[5] ← '(10 10 0 7 0 0 14 25 25 25 25 25 25 25 0
57500	       0 0 0 0  0 25 25 0 0
57600	       14 0 10 0 14 14 14 0 0 0);
57700	     TF[6]← '(10 10 0 7 0 0 14 25 25 25 25 25 25 25 0 
57800	       0 0 0 0 0 25 25 0 0
57900	       25 0 10 0 14 14 14 0 0 0);
58000	     TF[7]← TF[1];
58100	     TF[8]← TF[2];
58200	     TF[9] ← TF[3];
58300	     TF[10] ← TF[4];
58400	     TF[11] ← TF[5];
58500	     TF[12] ← TF[6];
58600	     TF[13] ← '(0 0 10 0 25 25 0 0 0 0 0 0 0 0 25 25 25 25 25 14
58700	       0 0 14 14 0 25 0 25 0 0 25 20 0 14);
58800	     TF[14] ← '(0 0 14 0 25 25 0 0 0 0 0 0 0 0 25 15 15 15 15 25 0
58900	       0 7 10 0 25 0 25 0 0 24 20 0 10);
59000	     TF[15] ← '(7 10 0 10 0 0 14 25 25 25 25 25 25 25 0 0 0 0 0
59100	         0 25 25 0 0 25 0 25 0 14 14 0 0 0 0);
59200	     TF[16] ← TF[15];
59300	     TF[17] ← TF[14];
59400	     TF[18] ← '(10 7 0 10 0 0 14 25 25 25 25 25 25 25 0 0 0 0 0 0 
59500	       25 25 0 0 25 0 25 0 14 14 0 0 0 0 );
59600	     TF[19] ← TF[18];
59700	     END;
59800	EXPR GS2();
59900	     BEGIN
60000	     SCHEMA2 ← '(DE FN2(L M)  (COND
60100	     ((AND ((CAR (GET F2 TARGS)) L)
60200	           ((CAR (GET F3 TARGS)) M)
60300	           ((CAR (GET F1 TARGS)) (F2 L))
60400	           ((CADR (GET F1 TARGS)) (F3 M))
60500	           (EQUAL (F1 (F2 L) (F3 M)) C1)
60600	           ((CAR (GET F5 TARGS)) L)
60700	           ((CAR (GET F6 TARGS)) M)
60800	           ((CAR (GET F4 TARGS)) (F5 L))
60900	           ((CADR (GET F4 TARGS)) (F6 M)))
61000	       (F4 (F5 L) (F6 M)))
61100	     ((AND ((CAR (GET F8 TARGS)) L)
61200	           ((CAR (GET F9 TARGS)) M)
61300	           ((CAR (GET F7 TARGS)) (F8 L))
61400	           ((CADR (GET F7 TARGS)) (F9 M))
61500	           (EQUAL (F7 (F8 L) (F9 M)) C3)
61600	            ((CAR (GET F11 TARGS)) L)
61700	           ((CAR (GET F12 TARGS)) M)
61800	           ((CAR (GET F10 TARGS)) (F11 L))
61900	           ((CADR (GET F10 TARGS)) (F12 M)))
62000	      (F10 (F11 L) (F12 M) )  )
62100	
62200	     ((OR (GT2 L M) 
62300	          (AND (INFINITY)
62400	               ((CAR (GET F16 TARGS)) M)
62500	               ((CAR (GET F15 TARGS)) L)
62600	               ((CAR (GET F14 TARGS)) (F15 L))
62700	               ((CADR (GET F14 TARGS)) (F16 M))
62800	               ((CAR (GET F18 TARGS)) L)
62900	               ((CAR (GET F19 TARGS)) M)
63000	               ((CAR (GET F17 TARGS)) (F18 L))
63100	               ((CADR (GET F17 TARGS)) (F19 M))
63200	               ((CAR (GET F13 TARGS))
63300	                        (SETQ &E1 (F14 (F15 L) (F16 M))))
63400	               ((CADR (GET F13 TARGS))
63500	                        (SETQ &E2 (F17 (F18 L) (F19 M))))))
63600	      (F13 &E1 &E2))
63700	     (T C2)   )   )))));
63800	     IF GREATERP(MSGLEVEL, 54) THEN PRINTSTR '" SCHEMA TWO IS";
63900	     IF GREATERP(MSGLEVEL, 53) THEN PRINT (SCHEMA2);
64000	     RETURN NIL;
64100	     END;
64200	EXPR REC2(FN,A,N,RELATEDF);
64300	     BEGIN NEW I,II,I1,I2,KK,JJ1,JJ2;
64400	     EE1←NIL;
64500	     EE2 ← NIL;
64600	     L1← NIL;
64700	     L2 ← NIL;
64800	     E←NIL;
64900	     MA←T;
65000	     MN←T;
65100	     MAL←T;
65200	     MA2 ←T;
65300	      MN2←T;
65400	     MAL2←T;
65500	     E1←NIL;
65600	     E2←NIL;
65700	     EXAMPLE[NEX+2,1]←L;
65800	     FOR NEW X←1 TO NEX+1 DO BEGIN
65900	       E1← EXAMPLE[X+1,1,1];
66000	       E2← EXAMPLE[X+1,1,2];
66100	     MA← MA AND ATOM(E1);
66200	     MA2← MA2 AND ATOM(E2);
66300	     MN ← MN AND NUMBER(E1);
66400	     MN2 ← MN2 AND NUMBER(E2);
66500	     MAL ← MAL AND ANYLIST(E1);
66600	     MAL2 ← MAL2 AND ANYLIST(E2);
66700	     END;
66800	     I← '(ANY ANY);
66900	     IF MAL THEN I[1] ← 'ANYLIST;
67000	     IF MAL2 THEN I[2] ← 'ANYLIST;
67100	     IF MA THEN I[1] ← 'ATOM;
67200	     IF MA2 THEN I[2] ← 'ATOM;
67300	     IF MN THEN I[1] ← 'NUMBER;
67400	     IF MN2 THEN I[2] ← 'NUMBER;
67500	     PUTPROP ('FN2, I, 'TARGS);
67600	     PUTPROP ('FN2, 2, 'NARGS);
67700	     PUTPROP ('FN2, 'ANY, 'TRES);
67800	     IHOLD← I;
67900	     PRINTSTR '"DO YOU KNOW THE TYPE OF ARGUMENTS FOR THE FN?
68000	        MY GUESS IS";
68100	     PRINC (IHOLD);
68200	     PRINTSTR '"     ANSWER N MEANS GUESS IS OK,
68300	       ANSWER Y MEANS YOU WANT TO CHANGE MY GUESS ...";
68400	     I←READ();
68500	     IF I='Y THEN BEGIN
68600	      PRINTSTR '"TYPE IN TWO OF THE WORDS:
68700	     ANY  ANYLIST  NUMBER  LISTP
68800	                          ( LISTP MEANS A NONNULL LIST)...";
68900	     I ← READ();
69000	     II ← READ();
69100	     IHOLD ← <I,II>;
69200	      PUTPROP('FN2, IHOLD, 'TARGS);
69300	     END;
69400	     FOR NEW K←1 TO 19 DO
69500	     ORD[K]←INTERSECTION(RELATEDF[1]@RELATEDF[2]@<'FN2>
69600	       @RELATEDF[3]@RELATEDF[4], ORDER2[K]);
69700	     FOR NEW K←1 TO 19 DO
69800	       ORD[K] ← RANK(K,ORD);
69900	     PRINTSTR '"DO YOU WANT TO CUT DOWN THE POSSIBILITIES?";
70000	     I←READ();
70100	     IF I='Y THEN  FOR NEW X←1 TO 19 DO
70200	     BEGIN
70300	     PRINT <'ORD,X,ORD[X]>;
70400	     PRINTSTR '"NOW RETYPE THIS SECTION OF ORD:";
70500	     I←READ();
70600	     IF NOT(I='S) THEN ORD[X]←I;
70700	     END;
70800	     IF C1='UNKNOWN THEN C1=T;
70900	     IF C3='UNKNOWN THEN C3=T;
71000	     I←NIL; II←NIL;
71100	     LIMINF←LIMINFBASE;
71200	     TAGF1 ← F1;
71300	    TAGF7 ← F7;
71400	    FOR NEW T2 ← 1 TO LENGTH(ORD[2]) DO BEGIN
71500	       F2 ← ORD[2,T2];
71600	     IF GREATERP(MSGLEVEL,0) THEN
71700	       PRINT <2,'T2,T2,'F2,F2>;
71800	     IF GREATERP(MSGLEVEL,49) THEN
71900	     PRINT<'L,L,'RELATEDFUNCTIONS,RELATEDF,'ORD,ORD>;
72000	     IF FOR NEW X← 2 TO NEX+1; AND
72100	        MAT(EXAMPLE[X,1],F2)        THEN
72200	     FOR NEW T3 ← 1 TO LENGTH(ORD[3]) DO BEGIN
72300	       F3←ORD[3,T3];
72400	     IF GREATERP(MSGLEVEL,1) THEN
72500	        PRINT <3,'T3,T3,'F3,F3>;
72600	      IF FOR NEW X←2 TO NEX+1; AND
72700	        MAT3(EXAMPLE[X,1],F3) THEN
72800	        FOR NEW T1←1 TO LENGTH(ORD[1]) DO BEGIN
72900	        F1← ORD[1,T1];
73000	       IF GREATERP(MSGLEVEL,2) THEN PRINT <1,'T1,T1,'F1,F1>;
73100	       IF FOR NEW X←2 TO NEX+1; AND
73200	           MAT2(EXAMPLE[X,1],F1,F2,F3) AND
73300	           (TAGF1 OR GOODEX=NIL OR F1(F2 (GOODEX[1,1],
73400	             F3(GOODEX[1,2]))=C1) THEN
73500	     FOR NEW T5←1 TO LENGTH(ORD[5]) DO BEGIN
73600	     F5 ← ORD[5,T5];
73700	     IF GREATERP(MSGLEVEL,4) THEN PRINT<5,'T5,T5,'F5,F5>;
73800	      IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F5) THEN
73900	     FOR NEW T6←1 TO LENGTH(ORD[6]) DO BEGIN
74000	     F6 ← ORD[6,T6];
74100	     IF GREATERP(MSGLEVEL,5) THEN PRINT <6,'T6,T6,'F6,F6>;
74200	     IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F6) THEN
74300	     FOR NEW T4← 1 TO LENGTH(ORD[4]) DO BEGIN
74400	     F4←ORD[4,T4];
74500	     IF GREATERP(MSGLEVEL,6) THEN PRINT <4,'T4,T4,'F4,F4>;
74600	     IF FOR NEW X←2 TO NEX+1; AND
74700	       MAT2(EXAMPLE[X,1],F4,F5,F6) AND
74800	       (LENGTH(ORD[4])=1 OR C2=NIL OR C2=UNKNOWN
74900	         OR F4(F5(L),F6(M))=C2)  THEN
75000	     FOR NEW T8←1 TO LENGTH(ORD[8]) DO BEGIN
75100	     F7←ORD[7,T7];
75200	     IF(GREATERP(MSGLEVEL,6)) THEN PRINT <7,'T7,T7,'F7,F7>;
75300	     IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F7) THEN
75400	     FOR NEW T9←1 TO LENGTH(ORD[9]) DO BEGIN
75500	     F9 ← ORD[9,T9];
75600	     IF GREATERP(MSGLEVEL,7) THEN PRINT <9,'T9,T9,'F9,F9>;
75700	     IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F9) THEN
75800	     FOR NEW T7←1 TO LENGTH(ORD[7]) DO  BEGIN
75900	     F7←ORD[7,T7];
76000	     IF GREATERP(MSGLEVEL,8) THEN PRINT <7,'T7,T7,'F7,F7 >;
76100	     IF FOR NEW X←2 TO NEX+1; AND
76200	       MAT2(EXAMPLE[X,1],F7,F8,F9) AND
76300	       (TAGF7 OR GOODEX2=NIL OR
76400	        F7(F8(GOODEX2[1,1]),F9(GOODEX2[1,2]))=C3) THEN
76500	     FOR NEW T11←1 TO LENGTH(ORD[11]) DO BEGIN
76600	     F11←ORD[11,T11];
76700	     IF GREATERP(MSGLEVEL,9) THEN PRINT <11,'T11,T11,'F11,F11>;
76800	     IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F11) THEN
76900	     FOR NEW T12←1 TO LENGTH(ORD[12]) DO BEGIN
77000	     F12←ORD[12,T12];
77100	     IF GREATERP(MSGLEVEL,10) THEN PRINT <12,'T12,T12,'F12,F12>;
77200	     IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F12) THEN
77300	     FOR NEW T10←1 TO LENGTH(ORD[10]) DO BEGIN
77400	     F10←ORD[10,T10];
77500	     IF GREATERP(MSGLEVEL,11) THEN PRINT <12,'T12,T12,'F12,F12>;
77600	     IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F10,F11,F12) THEN
77700	     FOR NEW T15← 1 TO LENGTH(ORD[15]) DO BEGIN
77800	     F15← ORD[15,T15];
77900	     IF GREATERP(MSGLEVEL,12) THEN PRINT <15,'T15,T15,'F15,F15>;
78000	     IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F15) THEN
78100	     FOR NEW F16←1 TO LENGTH(ORD[16]) DO BEGIN
78200	     F16←ORD[16,T16];
78300	     IF GREATERP(MSGLEVEL,13) THEN PRINT <16,'T16,T16,'F16,F16>;
78400	     IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F16) THEN
78500	     FOR NEW T14←1 TO LENGTH(ORD[14]) DO BEGIN
78600	     F14←ORD[14,T14];
78700	     IF GREATERP(MSGLEVEL,14) THEN PRINT <14,'T14,T14,'F14,F14>;
78800	     IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F14,F15,F16) THEN
78900	     FOR NEW T18←1 TO LENGTH(ORD[18]) DO BEGIN
79000	     F18←ORD[18,T18];
79100	     IF GREATERP(MSGLEVEL,15) THEN PRINT <18,'T18,T18,'F18,F18>;
79200	     IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F18) THEN
79300	     FOR NEW T19←1 TO LENGTH(ORD[19]) DO BEGIN
79400	     F19←ORD[19,T19];
79500	     IF GREATERP(MSGLEVEL,16) THEN PRINT <19,'T19,T19,'F19,F19>;
79600	     IF FOR NEX X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F19) THEN
79700	     FOR NEW T17←1 TO LENGTH(ORD[17]) DO BEGIN
79800	     F17←ORD[17,T17];
79900	     IF GREATERP(MSGLEVEL,17) THEN PRINT <17,'T17,T17,'F17,F17>;
80000	     IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F17,F18,F19) THEN
80100	     FOR NEW T13←1 TO LENGTH (ORD[13]) DO BEGIN
80200	     F13←ORD[13,T13];
80300	     IF GREATERP(MSGLEVEL,18) THEN PRINT <13,'T13,T13,'F13,F13>;
80400	     IF FOR NEW X←2 TO NEX+1; AND 
80500	     BEGIN L1←EXAMPLE[X,1,1]; L2←EXAMPLE[X,1,2];
80600	      I← ( EVAL '((CAR (GET F13 TARGS))
80700	                  (SETQ &E1 (F14 (F15 L1) (F16 L2))))
80800	     AND
80900	       EVAL '((CADR (GET F13 TARGS))
81000	                  (SETQ &E2 (F17 (F18 L1) (F19 L2)))) );
81100	     INF←0;
81200	     IF I THEN I← FOR NEW X←2 TO NEX+1; AND
81300	            EVAL '(FN2 &E1 &E2) = EXAMPLE[X,2];
81400	     IF I THEN PRINTSTR '" HOORAY, HOORAY
81500	                               SUCCESS";
81600	     RETURN I;
81700	     END UNTIL I
81800	     END UNTIL I
81900	     END UNTIL I
82000	     END UNTIL I
82100	     END UNTIL I
82200	     END UNTIL I
82300	     END UNTIL I
82400	     END UNTIL I
82500	     END UNTIL I
82600	     END UNTIL I
82700	     END UNTIL I
82800	     END UNTIL I
82900	     END UNTIL I
83000	     END UNTIL I
83100	     END UNTIL I
83200	     END UNTIL I
83300	      END UNTIL I
83400	     END UNTIL I
83500	     END UNTIL I;
83600	     IF GREATERP(MSGLEVEL,0) THEN
83700	      PRINT <'F1TOF19,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,
83800	        F11,F12,F13,F14,F15,F16,F17,F18,F19,'C1234,C1,C2,
83900	        C3,C4>;
84000	     KNOWNF ← FN2 CONS KNOWNF;
84100	     TARG ← GET('FN,'TARGS) CONS TARG;
84200	     NARG← N CONS NARG;
84300	     TRE ← GET('FN,'TRES) CONS TRE;
84400	     BA2 ← FN2 CONS BA2;
84500	     IF GREATERP(MSGLEVEL,35) THEN PRINT <'KNOWNF,KNOWNF,
84600	       'RELATESDF,RELATEDF,'TARG,TARG,'NARG,NARG,'TRE,
84700	       TRE,'BA2,BA2>;
84800	      PUTPROP(FN2,2,NARGS);
84900	     PUTPROP(FN2,IHOLD,TARGS);
85000	     PUTPROP(FN2,'ANY,TRES);
85100	      FINALIZE2();
85200	     FOR NEW J←1 TO 19 DO PUTPROP(FN2,11,P2F[J]);
85300	     RETURN FN2;
85400	     END;
85500	EXPR PRIM2();
85600	     BEGIN NEW I;
85700	     GOODEX ← NIL;
85800	     GOODEX2 ← NIL;
85900	     ONEX ← 0;
86000	     F1 ← NIL
86100	     F12 ← NIL
86200	     F3 ← NIL
86300	     F2 ← NIL;
86400	     F4 ← NIL;
86500	     F5 ← NIL;
86600	     F6 ← NIL;
86700	     F7 ← NIL;
86800	     F8 ← NIL;
86900	     F9←NIL;
87000	     F10 ← NIL;
87100	     F11 ← NIL;
87200	     PRINTSTR '"THERE IS SOME PRIMITIVE CASE (OR TWO).
87300	     DO YOU KNOW ANYTHING ABOUT IT? Y OR N...";
87400	     I← READ();
87500	     IF I='N THEN  BEGIN
87600	       IF GREATERP(MSGLEVEL,3) THEN PRINTSTR 
87700	       '"I AM ASSUMING F1 THROUGH F12 TO BE NIL,
87800	         C1 AND C3 TO BE T, C2 AND C4 TO BE UNKNOWN";
87900	       C1 ←T;
88000	       C3← T;
88100	       C2← UNKNOWN;
88200	       C4 ← UNKNOWN;
88300	     EXAMPLE[1] ←<C1,C2>;
88400	     RETURN NIL; 
88500	     END  ALSO RETURN NIL;
88600	     PRINTSTR '"FOR SOME FUNCTIONS F1,F2,F3,F4,F5,F6,
88700	     AND SOME CONSTANT C1, WHEN
88800	       F1( F2(ARG1), F3(ARG2) )  =  C1    THEN
88900	     THE VALUE OF YOUR FUNCTION IS 
89000	       F4( F5(ARG1), F6(ARG2) ) = C2
89100	
89200	     NOW TYPE IN NIL OR A FUNCTION NAME FOR F1,F2,F3,F4,F5,F6:";
89300	     F1←READ();
89400	     F2←READ();
89500	     F3←READ();
89600	     F4←READ();
89700	     F5←READ();
89800	     F6←READ();
89900	     PRINTSTR '"NOW TYPE IN A CONSTANT OR THE VALUE UNKNOWN FOR C1";
90000	     C1←READ();
90100	     PRINTSTR '"IF C2 IS A CONSTANT, TYPE IN ITS VALUE. IF IT
90200	     IS NOT CONSTANT, OR IF YOU DONT KNOW THE VALUE,TYPE UNKNOWN";
90300	     C2←READ();
90400	     EXAMPLE[1]←<C1,C2>;
90500	     PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS
90600	     PRIMITIVE CASE? Y OR N...";
90700	     I←READ();
90800	     IF I='Y THEN I←GETEX(2) ALSO ONEX←1 ALSO GOODEX←EXAMPLE[2];
90900	     PRINTSTR '"IS THERE ANOTHER PRIMITICE CASE? Y OR N...";
91000	     I←READ();
91100	     IF I='N THEN BEGIN
91200	     C3←T;
91300	    C4←UNKNOWN;
91400	     F7←'FALSE2;
91500	     F8←'FALSE;
91600	     F9←'FALSE;
91700	     F10←'FALSE2;
91800	     F11←'FALSE;
91900	     F12←'FALSE;
92000	     END ALSO RETURN NIL;
92100	     PRINTSTR '"FOR SOME FUNCTIONS F7,F8,F9,F10,F11,F12,
92200	     AND SOME CONSTANT C3, WHEN
92300	       F7( F8(ARG1), F9(ARG2) ) = C3 THEN
92400	     THE VALUE OF YOUR FUNCTION IS
92500	       F10( F11(ARG1), F12(ARG2) ) = C4
92600	
92700	     NOW TYPE IN NIL OR A FUNCTION NAME FOR F7 THROUGH F12:";
92800	     R`F7←READ();
92900	     F8←READ();
93000	     F9←READ();
93100	     F10←READ();
93200	     F11←READ();
93300	     F12←READ();
93400	     PRINTSTR '"NOW TYPE IN UNKNOWN OR A CONSTANT FOR C3,C4:";
93500	     C3←READ();
93600	     C4←READ();
93700	     PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS? Y OR N>>>";
93800	     I←READ();
93900	     IF I='Y THEN I←GETEX(3) ALSO ONEX←2 ALSO GOODEX2←EXAMPLE[3];
94000	     RETURN NIL;
94100	     END;
94200	EXPR FSUB(I);
94300	     IF I=1 THEN F1
94400	     ELSE IF I=2 THEN F2
94500	     ELSE IF I=3 THEN F3
94600	     ELSE IF I=4 THEN F4
94700	     ELSE IF I=5 THEN F5
94800	     ELSE IF I=6 THEN F6
94900	     ELSE IF I=7 THEN F7
95000	     ELSE IF I=8 THEN F8
95100	     ELSE IF I=9 THEN F9
95200	     ELSE IF I=10 THEN F10
95300	     ELSE IF I=11 THEN F11
95400	     ELSE IF I=12 THEN F12
95500	     ELSE IF I=13 THEN F13
95600	     ELSE IF I=14 THEN F14
95700	     ELSE IF I=15 THEN F15
95800	     ELSE IF I=16 THEN F16
95900	     ELSE IF I=17 THEN F17
96000	     ELSE IF I=18 THEN F18
96100	     ELSE IF I=19 THEN F19
96200	     ELSE PRINT <'FSUBERROR,'I,I>;
96300	EXPR FINALIZE2();
96400	     BEGIN
96500	     FOR NEW I←1 TO 19 DO
96600	     IF F1='FN2 THEN F1←FN2;
96700	     IF F4='FN2 THEN F4←FN2;
96800	     IF F7='FN2 THEN F7←FN2;
96900	     IF F10='FN2 THEN F10←FN2;
97000	     IF F13='FN2 THEN F13←FN2;
97100	     IF F14='FN2 THEN F14←FN2;
97200	     IF F17='FN2 THEN F17←FN2;
97300	     EVAL <'DE, FN2, '(L M),
97400	     <'COND, <<'EQUAL, <F1, <F2, 'L>,<F3,'M>>,C1>,
97500	                       <F4, <F5, 'L>,<F6, 'M>>>,
97600	                <<'EQUAL,<F7,<F8,'L>,<F9,'M>>,C3>,
97700	                         <F10,<F11,'L>,<F12,'M>>>,
97800	         <T,<F13,<F14,<F15,'L>,<F16,'M>>,
97900	                 <F17,<F18,'L>,<F19,'M>>>>>>;
98000	     RETURN KEEP();
98100	     END;
98200	EXPR FALSE2(A B); NIL;
98300	EXPR GT2(L M); OR(GOODEX AND GOODEX[1,1]=L AND GOODEX[1,2]=M,
98400	     GOODEX2 AND GOODEX2[1,1]=L AND GOODEX2[1,2]=M);
98500	EXPR MAT(E F);
98600	     GT2(CAR(E),CADR(E)) OR
98700	     EVAL '((CAR (GET F TARGS)) (CAR E));
98800	EXPR MAT2(E F G1 G2);
98900	     GT2(CAR(E),CADR(E))  OR
99000	     EVAL '((CAR (GET F TARGS)) (G1 (CAR E))) AND
99100	    EVAL '((CADR (GET F TARGS)) (G2 (CADR E));
99200	EXPR FALSE2(A B); NIL;
99300	EXPR MAT3(E F);
99400	     GT2(CAR(E),CADR(E)) OR
99500	     EVAL '((CAR (GET F TARGS)) (CADR E));
99600	END.